<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="u72441e99" id="u72441e99"><span data-lake-id="u73eaa010" id="u73eaa010">枚举类型是指由一组固定的常量组成合法的类型。Java中由关键字enum来定义一个枚举类型</span></p>
  <p data-lake-id="u0e773013" id="u0e773013"><span data-lake-id="uac901704" id="uac901704">​</span><br></p>
  <pre lang="java"><code>
public enum Season {
    SPRING, SUMMER, AUTUMN, WINER;
}
</code></pre>
  <p data-lake-id="uec1de01d" id="uec1de01d"><span data-lake-id="u91e12e70" id="u91e12e70" class="lake-fontsize-12">​</span><br></p>
  <p data-lake-id="u597eabe9" id="u597eabe9"><span data-lake-id="ua019c671" id="ua019c671" class="lake-fontsize-12">Java中枚举的好处如下：</span></p>
  <p data-lake-id="u237d1570" id="u237d1570"><span data-lake-id="u25a63c0a" id="u25a63c0a" class="lake-fontsize-12">​</span><br></p>
  <ol list="u8e07dd93">
   <li fid="u60a00697" data-lake-id="u340d2987" id="u340d2987"><span data-lake-id="ud6733d1a" id="ud6733d1a">枚举的</span><code data-lake-id="ucc48a859" id="ucc48a859"><span data-lake-id="udb508983" id="udb508983">valueOf</span></code><span data-lake-id="ua38c9c58" id="ua38c9c58">可以自动对入参进行非法参数的校验</span></li>
   <li fid="u60a00697" data-lake-id="u440913cb" id="u440913cb"><span data-lake-id="u963a7c03" id="u963a7c03">可以调用枚举中的方法，相对于普通的常量来说操作性更强</span></li>
   <li fid="u60a00697" data-lake-id="u1d3ac287" id="u1d3ac287"><span data-lake-id="ub2a025bb" id="ub2a025bb">枚举实现接口的话，可以很容易的实现策略模式</span></li>
   <li fid="u60a00697" data-lake-id="u839a38e6" id="u839a38e6"><span data-lake-id="u5ec3a723" id="u5ec3a723">枚举可以自带属性，扩展性更强</span></li>
  </ol>
  <p data-lake-id="uf368d34c" id="uf368d34c"><br></p>
  <h1 data-lake-id="Ue9tm" id="Ue9tm"><span data-lake-id="uadbeab00" id="uadbeab00">扩展知识</span></h1>
  <h2 data-lake-id="Sta7H" id="Sta7H"><span data-lake-id="ud44f1fcf" id="ud44f1fcf">枚举如何实现的？</span></h2>
  <p data-lake-id="uf3891d0a" id="uf3891d0a"><br></p>
  <p data-lake-id="u5edd6552" id="u5edd6552"><span data-lake-id="ua7fbe85f" id="ua7fbe85f">如果我们使用反编译，对一个枚举进行反编译的话，就能大致了解他的实现方式，如上面的Season枚举，反编译后内容如下：</span></p>
  <p data-lake-id="u149cc76d" id="u149cc76d"><span data-lake-id="u04fad87a" id="u04fad87a">​</span><br></p>
  <pre lang="java"><code>
public final class T extends Enum
{
    private T(String s, int i)
    {
        super(s, i);
    }
    public static T[] values()
    {
        T at[];
        int i;
        T at1[];
        System.arraycopy(at = ENUM$VALUES, 0, at1 = new T[i = at.length], 0, i);
        return at1;
    }

    public static T valueOf(String s)
    {
        return (T)Enum.valueOf(demo/T, s);
    }

    public static final T SPRING;
    public static final T SUMMER;
    public static final T AUTUMN;
    public static final T WINTER;
    private static final T ENUM$VALUES[];
    static
    {
        SPRING = new T("SPRING", 0);
        SUMMER = new T("SUMMER", 1);
        AUTUMN = new T("AUTUMN", 2);
        WINTER = new T("WINTER", 3);
        ENUM$VALUES = (new T[] {
            SPRING, SUMMER, AUTUMN, WINTER
        });
    }
}
</code></pre>
  <p data-lake-id="u03e4545d" id="u03e4545d"><span data-lake-id="u6086d8e8" id="u6086d8e8">​</span><br></p>
  <p data-lake-id="u47a5bc51" id="u47a5bc51"><span data-lake-id="uf65c4d18" id="uf65c4d18">通过反编译后代码我们可以看到，</span><strong><span data-lake-id="u937fdf46" id="u937fdf46">public final class T extends Enum，说明，该类是继承了Enum类的，同时final关键字告诉我们，这个类也是不能被继承的。当我们使用enum来定义一个枚举类型的时候，编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承，我们看到这个类中有几个属性和方法。</span></strong></p>
  <p data-lake-id="ucb208638" id="ucb208638"><br></p>
  <h2 data-lake-id="KBUl2" id="KBUl2"><span data-lake-id="u345d3e14" id="u345d3e14">枚举如何比较</span></h2>
  <p data-lake-id="u1eda9805" id="u1eda9805"><span data-lake-id="uaf3f4bc0" id="uaf3f4bc0">枚举的equals方法底层用的还是==，所以两者都可以</span></p>
  <p data-lake-id="u906797a0" id="u906797a0"><span data-lake-id="uf85d085e" id="uf85d085e">​</span><br></p>
  <h2 data-lake-id="cCHBZ" id="cCHBZ"><span data-lake-id="u669f240f" id="u669f240f">枚举单例的好处</span></h2>
  <p data-lake-id="uace77fd2" id="uace77fd2"><span data-lake-id="u4d5dd5f8" id="u4d5dd5f8">​</span><br></p>
  <p data-lake-id="ue548a01f" id="ue548a01f"><br></p>
 </body>
</html>